Unity物理システムの基本クラスまとめ
概要
ゲームエンジンでオブジェクトを現実のように動かしたい時は、物理エンジンを使います。
UnityというゲームエンジンにはUnityEngine.PhysicsModule
というモジュールがありまして、自分のメモでもあり、初めてUnityを触る方に向ける紹介文としてUnityの基本物理をまとめたいと思います。
主要なクラス
- Collider
BoxCollider
、CapsuleCollider
、SphereCollider
などの親クラスです。
Collider
とこれの子クラスは物と物の衝突を模擬する担当です。 -
Rigidbody
オブジェクトの位置、回転を物理的に模擬するクラス。 -
PhysicMaterial
摩擦係数、弾力係数などを持つ、Collider
に貼り付ける物理材質クラス。 -
Collision
当たったCollider
、位置情報を持つぶち当たる情報クラス。
各クラスの主要なパラメーター
まず、Rigidbody
を使う場合、他のオブジェクトに衝突することを検知するため、Collider
は必ず使います。
Rigidbody
あり、Collider
なしの場合、他のオブジェクトを突き抜けます。重力しか効きません(チェックされる場合)。Rigidbody
なし、Collider
ありの場合、物理が効かないけど(動かない)、Rigidbody
とCollider
両方持つオブジェクトにとって静止物となります。
下図を確認してください。
Collider
Collider
というクラスは、物理だけじゃなくて、イベント用のトリガーボリュームとしてもよく使われています。
Is Trigger
チェックすると、イベント用のトリガーボリュームになり、物理的に他のオブジェクトに影響しなくなります。Material (Physic Material)
摩擦係数、弾力係数が設定されるPhysic Material
をセットするスロットです。Center
とSize
Collider
の位置とサイズを調整するパラメーターです。
Rigidbody
Rigidbody
は物理に効く本体です。
Mass
質量のパラメーターです。重ければ重くほど、動かしにくいです。Drag
オブジェクトの抗力です。高ければ高くほど、動かしにくいです。Angular Drag
オブジェクト回転の抗力です。高ければ高くほど、回転しにくくなります。Use Gravity
重力に効くかどうかの設定です。初期状態はチェックされます。Is Kinematic
アニメーションでコントロールするかどうか。初期状態はチェックされていません。チェックすると、物理的に効かず、位置やスピートなどのはアニメーションに従うことになります。Interpolate
オブジェクトの動きをスムーズさせる設定です。Interpolate
とExtrapolate
二つ選択しがあります。
例えば元々オブジェクトが一秒ずつ動いてます。Interpolate
は0.0s
と1.0s
の間にある0.5s
の動きも計算し、動作をスムーズさせることで、Extrapolate
は1.5s
の動きを予測してから、1.0s
の動きをスムーズさせます。Collision Detection
衝突の検知モードするパラメーターです。フレーム毎に物理が計算されていますが、高速で移動しているオブジェクトが物が速すぎるので、比較的に薄い物にぶつかることの計算が間に合わなくて、突き抜けてしまいます。それを防ぐため、検知モードがいくつあります。Dicrete
、ContinuousSpeculative
、ContinuousDynamic
の順番で、検知精度が高くなり、パフォーマンスコストも上がります。Constraints
位置と回転のX、Y、Z軸をチェックしチェック、ロックする(変化させない)ことができます。
上記のパラメーターはインストラクターで編集できますが、速度のRigidbody.velocity
はコードで変更てきます。
Physic Material
Collider
のMaterial (Physic Material)
に貼り付ける物理材質です。設定されるパラメーターはCollider
の表面に反映されます。
Dynamic Friction
とStatic Friction
動的摩擦係数と静的摩擦係数です。Bounciness
弾力係数です。Friction Combine
物に接触する時摩擦力の計算モード(平均値、最小値、最大値、掛け算)Bounce Combine
物に接触する時弾力の計算モード(平均値、最小値、最大値、掛け算)
Collision (Code Only)
Collider
クラスのOnCollisionEnter(Collision)
、OnCollisionStay(Collision)
、OnCollisionExit(Collision)
関数に渡すローカル変数です。
衝突コールバック関数が呼ばれる時渡してくれます。これで衝突した物のCollider
、GameObject
などの情報を確認できます。
最後
以上紹介した物を上手く運用すれば、ゲーム内基本な物理シミュレーションができます。
ただ全体的に注意してもらいたいのは、Unityに二つフレーム更新関数があります。Update()
は画像レンダリングのフレーム毎に呼ばれてる関数(フレームレート関連、固定されません)、そしてFixedUpdate()
はレンダリングに依存しない、物理専用、決まった頻度で呼ばれる関数です。物理計算などはFixedUpdate()
に行うことが推奨されています。FixedUpdate()
の頻度初期値は0.02s
(毎秒50回、コード上Time.fixedDeltaTime
に反映しています)ですが、Edit -> Project Setting -> Time
に設定できます。